import OpenAI from "openai";
import { tools, getCurrentWeather, getCurrentTime } from "./tools.js";
import dotenv from "dotenv";
dotenv.config();

const openai = new OpenAI({
  apiKey: process.env.API_KEY,
});

// 1. 用户提的问题
const messages = [
  {
    role: "user",
    content: "北京今天的天气怎么样？另外，现在几点了？",
  },
];

// 2. 将问题 + 工具箱一起给模型，模型判断是否使用工具
const res = await openai.chat.completions.create({
  model: "gpt-3.5-turbo-1106",
  messages,
  tools,
  parallel_tool_calls: false,
});

console.dir(res.choices[0], { depth: null });

const assistanMsg = res.choices[0].message;

// 不需要调用工具的情况
if (!assistanMsg.tool_calls?.length) {
  console.log("模型未调用任何工具，直接回复的内容：", assistanMsg.content);
  process.exit(0);
}

// 下面是需要调用工具的流程
messages.push(assistanMsg);

// 构建一个本地的工具箱
const funcs = {
  getCurrentWeather,
  getCurrentTime,
};

for (const call of assistanMsg.tool_calls) {
  const {
    id: tool_call_id,
    function: { name, arguments: args },
  } = call;

  const fn = funcs[name];

  if (!fn) {
    messages.push({
      role: "tool",
      tool_call_id,
      name,
      content: JSON.stringify({
        error: `${name}的工具不存在`,
      }),
    });
    continue;
  }

  const toolResult = await fn(args);

  // 针对工具调用返回的结果做一个简单的日志
  const content =
    typeof toolResult === "string" ? toolResult : JSON.stringify(toolResult);

  console.log(`已执行 ${name}(${JSON.stringify(args)}), 返回: ${content}`);

  // 将工具调用结果和之前的会话组装起来，再给大模型
  messages.push({
    role: "tool",
    tool_call_id,
    name,
    content,
  });
}

const finalRes = await openai.chat.completions.create({
  model: "gpt-3.5-turbo-1106",
  messages,
  tools,
});
// console.log("最终回答：", finalRes.choices[0].message.content);
console.log(finalRes.choices[0].message.tool_calls);
